home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adatutor / lrmrdr / lrm.a < prev    next >
Text File  |  1996-01-30  |  61KB  |  1,714 lines

  1. --::::::::::
  2. --copyrite.ada
  3. --::::::::::
  4. -- ***********************************************************************
  5. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  6. --
  7. -- COPYRIGHT NOTICE
  8. -- Ada LRM Reader - Interactive Presentation of the Ada LRM
  9. -- Copyright (C) 1992    Richard Conn
  10. --
  11. -- This program is free software; you can redistribute it
  12. -- and/or modify it under the terms of the GNU General Public
  13. -- License Version 1 as published by the Free Software
  14. -- Foundation.
  15. --
  16. -- This program is distributed in the hope that it will be
  17. -- useful, but WITHOUT ANY WARRANTY; without even the implied
  18. -- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  19. -- PURPOSE.  See the GNU General Public License for more
  20. -- details.  You should have received a copy of the GNU General
  21. -- Public License along with this program; if not, write to the
  22. -- Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
  23. -- 02139, USA.  See the ABOUT screens for further information,
  24. -- including information on how to contact the author.
  25. --::::::::::
  26. --command.ads
  27. --::::::::::
  28. -- ***********************************************************************
  29. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  30. with Citation_Definition;
  31. package Command_Dispatcher is
  32.  
  33.   function Convert_Citation (CitS : in STRING)
  34.     return Citation_Definition.CITATION_ID;
  35.   -- Convert the indicated string ("n.n.n" or "keyword") to CITATION_ID
  36.  
  37.   procedure View_Help;
  38.   -- View help citation and then Dispatch (Citation_Definition.USER_INPUT)
  39.  
  40.   procedure Dispatch (Current_Citation : in Citation_Definition.CITATION_ID);
  41.   -- Dispatch Current_Citation as first command and continue with
  42.   -- USER_INPUT until command is QUIT
  43.  
  44. end Command_Dispatcher;
  45. --::::::::::
  46. --display.ads
  47. --::::::::::
  48. -- ***********************************************************************
  49. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  50. with SYSDEP;
  51. with Citation_Definition;
  52. with DAF_Handler;
  53. with System;  -- standard Ada environment
  54. with Console; -- CS Parts
  55. package Screen_Display_Controller is
  56.  
  57.   type ERROR_MESSAGE_ID is (INVALID_COMMAND,
  58.                             CANNOT_ADVANCE, CANNOT_BACK,
  59.                             STACK_EMPTY, STACK_FULL,
  60.                             PRINT_LOG,
  61.                             TOO_MANY_SCREENS,
  62.                             SEARCH_STRING,
  63.                             DAF_NOT_FOUND,
  64.                             INTERNAL_DAF_NDFO_ERROR,
  65.                             INTERNAL_DAF_RE_ERROR,
  66.                             INTERNAL_DAF_SO_ERROR,
  67.                             INTERNAL_DAF_UE_ERROR,
  68.                             UNEXPECTED_ERROR);
  69.   -- Kinds of error messages which may be displayed
  70.  
  71.   type SCREEN_BUFFER is array (NATURAL'(1)..SYSDEP.Text_Line_Count) of
  72.     DAF_Handler.LINE;
  73.   -- Lines associated with a screen
  74.  
  75.   type SCREEN_BUFFER_POINTER is access SCREEN_BUFFER;
  76.   -- Pointer to a screen buffer so the full buffer does not have to be
  77.   -- passed
  78.  
  79.   subtype LINE_NUMBER is NATURAL
  80.     range NATURAL(Console.ROW_NUMBER'FIRST) ..
  81.           NATURAL(Console.ROW_NUMBER'LAST);
  82.   -- Valid line number from Console.ROW_NUMBER
  83.  
  84.   procedure Show_Text;
  85.   -- Clear screen and display the text area
  86.  
  87.   procedure Mark_Line (Number : in LINE_NUMBER);
  88.   -- Place a mark on the indicated line
  89.  
  90.   procedure Show_Prompt;
  91.   -- Display prompt on command line; if Search_String is null, do not
  92.   -- display it; clear error message if one is present after one call
  93.   -- to Show_Prompt
  94.  
  95.   procedure Show_Error (Item : in ERROR_MESSAGE_ID);
  96.   -- Display error message
  97.  
  98.   procedure Print_Log_File_Closed_Message;
  99.   -- Print the message that the indicated print log file is closed
  100.  
  101.   function Convert (SB_Address : in System.ADDRESS) return
  102.     SCREEN_BUFFER_POINTER;
  103.   -- Given the address of a screen buffer object, return a pointer to it
  104.  
  105.   function Citation_to_Display (CitX : in Citation_Definition.CITATION_ID)
  106.       return STRING;
  107.   -- Given a citation ID, return a string of the form "n.n.n" or "keyword"
  108.  
  109. end Screen_Display_Controller;
  110. --::::::::::
  111. --pcit.ads
  112. --::::::::::
  113. -- ***********************************************************************
  114. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  115. with SYSDEP;
  116. with Citation_Definition;
  117. with Screen_Display_Controller;
  118. package Primitive_Citation_Handler is
  119.  
  120.   subtype SEARCH_STRING is STRING (1..SYSDEP.Screen_String_Length);
  121.  
  122.   -- Statistics on current citation
  123.   type CITATION_STATISTICS is record
  124.     ID                      : Citation_Definition.CITATION_ID;
  125.     Current_Screen_Number   : NATURAL;
  126.     Total_Number_of_Screens : NATURAL;
  127.     Stack_Level             : NATURAL;
  128.     Search_Str              : SEARCH_STRING;
  129.     Search_Last             : NATURAL; -- index of last char in Search_Str
  130.     Search_May_Be_Continued : BOOLEAN;
  131.   end record;
  132.  
  133.   -- Status of a search request
  134.   type SEARCH_STATUS is record
  135.     Is_Found        : BOOLEAN;  -- TRUE if string was found
  136.     Found_on_Screen : NATURAL;  -- if found, screen string was found on
  137.     Found_on_Line   : NATURAL;  -- if found, line string was found on
  138.   end record;
  139.  
  140.   -- Exceptions:
  141.   SCREEN_COUNT_OVERFLOW : exception;
  142.     -- raised if number of screens exceeds SYSDEP.Max_Number_of_Screens
  143.     -- raised by Open_New_Citation
  144.  
  145.   function DAF_File_Name (ITEM : in Citation_Definition.CITATION_ID)
  146.       return STRING;
  147.   -- Return the name of the *.daf file associated with a given CITATION_ID
  148.  
  149.   procedure Open_New_Citation (ID : in Citation_Definition.CITATION_ID);
  150.   -- Open a new citation for processing, closing the old one if
  151.   -- necessary; set the current screen to the first screen;
  152.   -- build an array of information on the screens
  153.  
  154.   function Push return BOOLEAN;
  155.   -- Push the stack, returning TRUE if OK
  156.  
  157.   function Pop return BOOLEAN;
  158.   -- Pop the stack, returning TRUE if OK
  159.   -- Screen Buffer is loaded appropriately
  160.  
  161.   procedure Load_Screen_Buffer;
  162.   -- Load the screen buffer with the current screen
  163.  
  164.   function Next_Screen return BOOLEAN;
  165.   -- Advance to the next screen, returning TRUE if done;
  166.   -- if at last screen of current citation, advance to the first screen
  167.   -- of the next citation
  168.   -- Screen Buffer is loaded appropriately
  169.  
  170.   function Previous_Screen return BOOLEAN;
  171.   -- Back up to the previous screen, returning TRUE if done;
  172.   -- if at first screen of current citation, back up to last screen
  173.   -- of previous citation
  174.   -- Screen Buffer is loaded appropriately
  175.  
  176.   function Next_Citation return BOOLEAN;
  177.   -- Advance to the first screen of the next citation, returning TRUE
  178.   -- if done Screen Buffer is loaded appropriately
  179.  
  180.   function Previous_Citation return BOOLEAN;
  181.   -- Back up to the first screen of the previous citation, returning TRUE
  182.   -- if done
  183.   -- Screen Buffer is loaded appropriately
  184.  
  185.   function Search_First (Item : in STRING) return SEARCH_STATUS;
  186.   -- Search for the Item from the beginning of the citation;
  187.   -- if Item is an empty string, resume search for last item requested
  188.  
  189.   function Search_Next (Item : in STRING) return SEARCH_STATUS;
  190.   -- Resume search for Item from the next line in the citation;
  191.   -- if Item is an empty string, resume search for last item requested
  192.  
  193.   function Current_Citation return CITATION_STATISTICS;
  194.   -- Return the statistics on the current citation
  195.  
  196.   procedure Close_All_Open_Citations;
  197.   -- Close all open citation files
  198.  
  199.   procedure Suspend;
  200.   -- Suspend operation for Print_Log
  201.  
  202.   procedure Resume;
  203.   -- Resume operation for Print_Log
  204.  
  205.   function Access_Screen
  206.     return Screen_Display_Controller.SCREEN_BUFFER_POINTER;
  207.   -- Return the address of the screen for printing or displaying
  208.  
  209. end Primitive_Citation_Handler;
  210. --::::::::::
  211. --cithandl.ads
  212. --::::::::::
  213. -- ***********************************************************************
  214. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  215. with Citation_Definition;
  216. package Citation_Handler is
  217. -- Abstract state machine for selecting and working with a given citation
  218.  
  219.   procedure View_Citation
  220.       (New_Citation : in Citation_Definition.CITATION_ID);
  221.   -- Start viewing a new citation, displaying the first screen
  222.  
  223.   procedure Redisplay_Current_Screen;
  224.   -- Refresh current screen in current citation
  225.  
  226.   procedure Next_Screen;
  227.   -- Advance to next screen in current citation and display
  228.  
  229.   procedure Previous_Screen;
  230.   -- Back up to previous screen in current citation and display
  231.  
  232.   procedure Next_Citation;
  233.   -- Close current citation and view first screen of next citation
  234.  
  235.   procedure Previous_Citation;
  236.   -- Close current citation and view first screen of previous citation
  237.  
  238.   procedure Push (New_Citation : in Citation_Definition.CITATION_ID);
  239.   -- Save position in current citation and
  240.   -- start viewing a new citation, displaying the first screen
  241.  
  242.   procedure Pop;
  243.   -- Return to current position in last citation before last PUSH
  244.  
  245.   procedure Search_for_First_Occurrence (Item : in STRING);
  246.   -- Search for first occurrence of string in current citation
  247.  
  248.   procedure Search_for_Next_Occurrence (Item : in STRING);
  249.   -- Search for next occurrence of string in current citation
  250.  
  251.   procedure Close_All_Open_Citations;
  252.   -- Close all open citations
  253.  
  254. end Citation_Handler;
  255. --::::::::::
  256. --printlog.ads
  257. --::::::::::
  258. -- ***********************************************************************
  259. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  260. package Print_Log_Handler is
  261. -- Abstract state machine for manipulating the Print Log File
  262.  
  263.   PRINT_LOG_CREATION_ERROR : exception;
  264.  
  265.   procedure Print_Current_Citation;
  266.   -- Print current citation to log file
  267.  
  268.   procedure Print_Current_Screen;
  269.   -- Print current screen to log file
  270.  
  271.   procedure Close_Print_Log;
  272.   -- Close log file and display message to user
  273.  
  274. end Print_Log_Handler;
  275. --::::::::::
  276. --lrm.ada
  277. --::::::::::
  278. -- ***********************************************************************
  279. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  280. with SYSDEP;
  281. with Citation_Definition;
  282. with Citation_Handler;
  283. with Command_Dispatcher;
  284. with Print_Log_Handler;
  285. with Screen_Display_Controller;
  286. with CLI;     -- CS Parts
  287. with Console; -- CS Parts
  288. procedure LRM_Reader is
  289.   use Citation_Definition;  -- for equality tests
  290.  
  291.   First_Citation : Citation_Definition.CITATION_ID;
  292.   Last_Citation_Allowed : constant Citation_Definition.CITATION_ID :=
  293.     Citation_Definition.HELP;
  294.  
  295. begin -- LRM_Reader
  296.  
  297.   CLI.Initialize ("LRM", "LRM");
  298.   for I in SYSDEP.Intro_Copyright_Notice'RANGE loop
  299.     Console.Put_Line (SYSDEP.Intro_Copyright_Notice(I));
  300.   end loop;
  301.   delay 1.0;
  302.   if CLI.Argc = 1 then
  303.     Command_Dispatcher.View_Help;
  304.   else
  305.     First_Citation := Command_Dispatcher.Convert_Citation (CLI.Argv(1));
  306.     if First_Citation >= Citation_Definition.CITATION_ID'FIRST and
  307.        First_Citation < Last_Citation_Allowed then
  308.       Command_Dispatcher.Dispatch (First_Citation);
  309.     else
  310.       Command_Dispatcher.View_Help;
  311.     end if;
  312.   end if;
  313.  
  314.   Print_Log_Handler.Close_Print_Log;
  315.   Citation_Handler.Close_All_Open_Citations;
  316.  
  317. exception -- LRM_Reader
  318.   when others =>
  319.     Screen_Display_Controller.Show_Error
  320.       (Screen_Display_Controller.UNEXPECTED_ERROR);
  321.     Print_Log_Handler.Close_Print_Log;
  322.  
  323. end LRM_Reader;
  324. --::::::::::
  325. --command.adb
  326. --::::::::::
  327. -- ***********************************************************************
  328. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  329. with SYSDEP;
  330. with Citation_Handler;
  331. with DAF_Handler;
  332. with Primitive_Citation_Handler;
  333. with Print_Log_Handler;
  334. with Screen_Display_Controller;
  335. with Console; -- CS Parts
  336. package body Command_Dispatcher is
  337.  
  338.   use Citation_Definition; -- for infix operators only
  339.  
  340.   New_Command               : STRING (1..SYSDEP.Max_String_Length);
  341.   New_Command_Length        : NATURAL;
  342.  
  343.   Citation_to_Process       : Citation_Definition.CITATION_ID;
  344.  
  345.   ---------------------------------------------------------------
  346.   -- Support Routines
  347.   ---------------------------------------------------------------
  348.   procedure Process_User_Input is
  349.   -- Display prompt, get line from user, and process
  350.   begin -- Process_User_Input
  351.  
  352.     -- init command's first five characters to spaces
  353.     New_Command (1..5) := "     "; -- 5 spaces
  354.   
  355.     -- input command
  356.     Screen_Display_Controller.Show_Prompt;
  357.     Console.Get_Line (New_Command, New_Command_Length);
  358.  
  359.     -- remove trailing spaces
  360.     for I in reverse 1 .. New_Command_Length loop
  361.       if New_Command(I) > ' ' then
  362.         New_Command_Length := I;
  363.         exit;
  364.       end if;
  365.       if I = 1 then
  366.         New_Command_Length := 0;
  367.       end if;
  368.     end loop;
  369.  
  370.     -- if <CR> was typed, command is Next_Screen
  371.     if New_Command_Length = 0 then
  372.  
  373.       Citation_Handler.Next_Screen;
  374.  
  375.     else -- figure out what command was
  376.  
  377.       -- check for search_first (/) and search_next (//)
  378.       if New_Command(1) = '/' then
  379.         if New_Command(2) = '/' then
  380.           Citation_Handler.Search_for_Next_Occurrence
  381.             (New_Command(3..New_Command_Length));
  382.         else
  383.           Citation_Handler.Search_for_First_Occurrence
  384.             (New_Command(2..New_Command_Length));
  385.         end if;
  386.   
  387.       -- check for PUSH
  388.       elsif Convert_Citation(New_Command(1..4)) =
  389.             Citation_Definition.PUSH then
  390.         declare
  391.           Start : NATURAL := New_Command_Length;
  392.         begin
  393.           for I in 5 .. New_Command_Length loop
  394.             if New_Command(I) > ' ' then
  395.               Start := I;
  396.               exit;
  397.             end if;
  398.           end loop;
  399.           Citation_Handler.Push (Convert_Citation(New_Command
  400.             (Start..New_Command_Length)));
  401.         end;
  402.  
  403.       -- handle all other commands as citations to return thru Dispatch
  404.       else
  405.         Citation_to_Process :=
  406.           Convert_Citation(New_Command(1..New_Command_Length));
  407.       end if;
  408.     end if;
  409.  
  410.   end Process_User_Input;
  411.  
  412.   ---------------------------------------------------------------
  413.   -- Exported Routines
  414.   ---------------------------------------------------------------
  415.   function Convert_Citation (CitS : in STRING)
  416.     return Citation_Definition.CITATION_ID is
  417.  
  418.     use Citation_Definition;
  419.  
  420.     type PARSE_STATE is (IN_CHAPTER,
  421.                          IN_SECTION,    TO_SECTION,
  422.                          IN_SUBSECTION, TO_SUBSECTION,
  423.                          IN_PARAGRAPH,  TO_PARAGRAPH);
  424.  
  425.     CFirst_Index           : NATURAL;
  426.     CLast_Index            : NATURAL;
  427.     PFirst_Index           : NATURAL;
  428.     PLast_Index            : NATURAL;
  429.     SFirst_Index           : NATURAL;
  430.     SLast_Index            : NATURAL;
  431.     SSFirst_Index          : NATURAL;
  432.     SSLast_Index           : NATURAL;
  433.     CFound                 : BOOLEAN := FALSE;
  434.     PFound                 : BOOLEAN := FALSE;
  435.     SFound                 : BOOLEAN := FALSE;
  436.     SSFound                : BOOLEAN := FALSE;
  437.     State                  : PARSE_STATE := IN_CHAPTER;
  438.     Result                 : CITATION_ID;
  439.  
  440.     Cit_Str                : STRING(1..20);
  441.     Cit_Index              : NATURAL;
  442.  
  443.     procedure Reset_Citation_String is
  444.     begin
  445.       Cit_Index := 0;
  446.     end Reset_Citation_String;
  447.  
  448.     function String_to_Citation (Str : in STRING) return CITATION_ID is
  449.     begin
  450.       return CITATION_ID'VALUE (Str);
  451.     exception
  452.       when others =>
  453.         return ERROR;
  454.     end String_to_Citation;
  455.  
  456.     procedure Append_to_Citation_String (Kind  : in CHARACTER;
  457.                                          Value : in STRING) is
  458.     begin
  459.       Cit_Index := Cit_Index + 1;
  460.       Cit_Str(Cit_Index) := Kind;
  461.       Cit_Index := Cit_Index + 1;
  462.       Cit_Str(Cit_Index .. Cit_Index + Value'LENGTH - 1) :=
  463.         Value;
  464.       Cit_Index := Cit_Index + Value'LENGTH - 1;
  465.     end Append_to_Citation_String;
  466.  
  467.   begin -- Convert_Citation
  468.  
  469.     -- Check for empty CitS
  470.     if CitS'LENGTH = 0 then
  471.       return ERROR;
  472.     end if;
  473.  
  474.     -- Check for special cases (HELP, CONTENTS, etc)
  475.     Result := String_to_Citation(CitS);
  476.     if Result /= ERROR then
  477.       return Result;
  478.     end if;
  479.  
  480.     -- Extract indices of chapter, section, subsection, and paragraph
  481.     CFirst_Index := CitS'FIRST;
  482.     CLast_Index  := CitS'FIRST;
  483.  
  484.     for I in CitS'FIRST .. CitS'LAST loop
  485.  
  486.       if CitS(I) in '0' .. '9' or
  487.          CitS(I) in 'A' .. 'Z' or
  488.          CitS(I) in 'a' .. 'z' or
  489.          CitS(I) = '.'  or CitS(I) = '/' then -- valid citation char
  490.  
  491.         case State is
  492.           when IN_CHAPTER    =>
  493.             Clast_Index := I;
  494.             CFound := TRUE;
  495.             if CitS(I) = '.' then
  496.               if I > CitS'FIRST then
  497.                 CLast_Index := I-1;
  498.                 State := TO_SECTION;
  499.               else
  500.                 return ERROR;
  501.               end if;
  502.             elsif CitS(I) = '/' then
  503.               CLast_Index := I-1;
  504.               State := TO_PARAGRAPH;
  505.             end if;
  506.  
  507.           when TO_SECTION    =>
  508.             if CitS(I) not in '0' .. '9' then
  509.               return ERROR;
  510.             end if;
  511.             SFirst_Index := I;
  512.             SLast_Index  := I;
  513.             State := IN_SECTION;
  514.             SFound := TRUE;
  515.  
  516.           when IN_SECTION    =>
  517.             SLast_Index := I;
  518.             if CitS(I) = '.' then
  519.               SLast_Index := I-1;
  520.               State := TO_SUBSECTION;
  521.             elsif CitS(I) = '/' then
  522.               SLast_Index := I-1;
  523.               State := TO_PARAGRAPH;
  524.             end if;
  525.  
  526.           when TO_SUBSECTION =>
  527.             if CitS(I) not in '0' .. '9' then
  528.               return ERROR;
  529.             end if;
  530.             SSFirst_Index := I;
  531.             SSLast_Index  := I;
  532.             State := IN_SUBSECTION;
  533.             SSFound := TRUE;
  534.  
  535.           when IN_SUBSECTION =>
  536.             SSLast_Index := I;
  537.             if CitS(I) = '/' then
  538.               SSLast_Index := I-1;
  539.               State := TO_PARAGRAPH;
  540.             end if;
  541.  
  542.           when TO_PARAGRAPH  =>
  543.             if CitS(I) not in '0' .. '9' then
  544.               return ERROR;
  545.             end if;
  546.             PFirst_Index := I;
  547.             PLast_Index  := I;
  548.             State := IN_PARAGRAPH;
  549.             PFound := TRUE;
  550.  
  551.           when IN_PARAGRAPH  =>
  552.             PLast_Index := I;
  553.             if CitS(I) not in '0' .. '9' then
  554.               return ERROR;
  555.             end if;
  556.         end case;
  557.  
  558.       else -- invalid citation character
  559.         return ERROR;
  560.       end if;
  561.  
  562.     end loop;
  563.  
  564.     Reset_Citation_String;
  565.  
  566.     if CFound then
  567.       Append_to_Citation_String ('C', CitS(CFirst_Index .. CLast_Index));
  568.     else
  569.       return ERROR;
  570.     end if;
  571.  
  572.     if SFound then
  573.       Append_to_Citation_String ('P', CitS(SFirst_Index .. SLast_Index));
  574.     end if;
  575.  
  576.     if SSFound then
  577.       Append_to_Citation_String ('P', CitS(SSFirst_Index .. SSLast_Index));
  578.     end if;
  579.  
  580.     if PFound then
  581.       Append_to_Citation_String ('P', CitS(PFirst_Index .. PLast_Index));
  582.     end if;
  583.  
  584.     return String_to_Citation (Cit_Str(1..Cit_Index));
  585.  
  586.   end Convert_Citation;
  587.  
  588.   ---------------------------------------------------------------
  589.   procedure View_Help is
  590.   begin -- View_Help
  591.     Citation_Handler.View_Citation (Citation_Definition.HELP);
  592.     Dispatch (Citation_Definition.USER_INPUT);
  593.   end View_Help;
  594.  
  595.   ---------------------------------------------------------------
  596.   procedure Dispatch (Current_Citation : in Citation_Definition.CITATION_ID)
  597.       is
  598.   begin -- Dispatch
  599.  
  600.     -- Set Citation_to_Process
  601.     Citation_to_Process := Current_Citation;
  602.  
  603.     -- Process Citation_to_Process as a command or a new citation to view
  604.     while Citation_to_Process /= Citation_Definition.QUIT loop
  605.       begin
  606.         case Citation_to_Process is -- all but QUIT (handled by while) and
  607.                                     -- PUSH (handled by Process_User_Input)
  608.           when Citation_Definition.N          =>
  609.               Citation_Handler.Next_Screen;
  610.               Citation_to_Process :=
  611.                   Citation_Definition.USER_INPUT;
  612.           when Citation_Definition.P          =>
  613.               Citation_Handler.Previous_Screen;
  614.               Citation_to_Process :=
  615.                   Citation_Definition.USER_INPUT;
  616.           when Citation_Definition.NEXT       =>
  617.               Citation_Handler.Next_Citation;
  618.               Citation_to_Process :=
  619.                   Citation_Definition.USER_INPUT;
  620.           when Citation_Definition.PREVIOUS   =>
  621.               Citation_Handler.Previous_Citation;
  622.               Citation_to_Process :=
  623.                   Citation_Definition.USER_INPUT;
  624.           when Citation_Definition.POP        =>
  625.               Citation_Handler.Pop;
  626.               Citation_to_Process :=
  627.                   Citation_Definition.USER_INPUT;
  628.           when Citation_Definition.PRINT      =>
  629.               Print_Log_Handler.Print_Current_Citation;
  630.               Citation_to_Process :=
  631.                   Citation_Definition.USER_INPUT;
  632.           when Citation_Definition.PS         =>
  633.               Print_Log_Handler.Print_Current_Screen;
  634.               Citation_to_Process :=
  635.                   Citation_Definition.USER_INPUT;
  636.           when Citation_Definition.PAUSE      =>
  637.               delay 5.0;  -- seconds
  638.               Citation_to_Process :=
  639.                   Citation_Definition.USER_INPUT;
  640.           when Citation_Definition.HELP       =>
  641.               Citation_Handler.Push (Citation_Definition.HELP);
  642.               Citation_to_Process :=
  643.                   Citation_Definition.USER_INPUT;
  644.           when Citation_Definition.REFRESH    =>
  645.               Citation_Handler.Redisplay_Current_Screen;
  646.               Citation_to_Process :=
  647.                   Citation_Definition.USER_INPUT;
  648.           when Citation_Definition.USER_INPUT =>
  649.               Process_User_Input;
  650.           when Citation_Definition.ERROR      =>
  651.               Screen_Display_Controller.Show_Error
  652.                 (Screen_Display_Controller.INVALID_COMMAND);
  653.               Citation_to_Process :=
  654.                   Citation_Definition.USER_INPUT;
  655.           when others         =>
  656.               Citation_Handler.View_Citation(Citation_to_Process);
  657.               Citation_to_Process :=
  658.                   Citation_Definition.USER_INPUT;
  659.         end case;
  660.  
  661.       exception
  662.         when DAF_Handler.FILE_NOT_FOUND =>
  663.           Screen_Display_Controller.Show_Error
  664.             (Screen_Display_Controller.DAF_NOT_FOUND);
  665.           Citation_to_Process := Citation_Definition.USER_INPUT;
  666.         when DAF_Handler.NO_DAF_OPEN =>
  667.           Screen_Display_Controller.Show_Error
  668.             (Screen_Display_Controller.INTERNAL_DAF_NDFO_ERROR);
  669.           Citation_to_Process := Citation_Definition.USER_INPUT;
  670.         when DAF_Handler.READ_ERROR =>
  671.           Screen_Display_Controller.Show_Error
  672.             (Screen_Display_Controller.INTERNAL_DAF_RE_ERROR);
  673.           Citation_to_Process := Citation_Definition.USER_INPUT;
  674.         when DAF_Handler.STACK_OVERFLOW =>
  675.           Screen_Display_Controller.Show_Error
  676.             (Screen_Display_Controller.INTERNAL_DAF_SO_ERROR);
  677.           Citation_to_Process := Citation_Definition.USER_INPUT;
  678.         when DAF_Handler.UNEXPECTED_ERROR =>
  679.           Screen_Display_Controller.Show_Error
  680.             (Screen_Display_Controller.INTERNAL_DAF_UE_ERROR);
  681.           Citation_to_Process := Citation_Definition.USER_INPUT;
  682.         when Primitive_Citation_Handler.SCREEN_COUNT_OVERFLOW =>
  683.           Screen_Display_Controller.Show_Error
  684.             (Screen_Display_Controller.TOO_MANY_SCREENS);
  685.           Citation_to_Process := Citation_Definition.USER_INPUT;
  686.         when Print_Log_Handler.PRINT_LOG_CREATION_ERROR =>
  687.           Screen_Display_Controller.Show_Error
  688.             (Screen_Display_Controller.PRINT_LOG);
  689.           Citation_to_Process := Citation_Definition.USER_INPUT;
  690.         when others =>
  691.           Screen_Display_Controller.Show_Error
  692.             (Screen_Display_Controller.UNEXPECTED_ERROR);
  693.           Citation_to_Process := Citation_Definition.USER_INPUT;
  694.       end;
  695.  
  696.     end loop;
  697.  
  698.     Console.Position_Cursor (SYSDEP.Error_Message_Line_Number, 1);
  699.     Console.Erase_Line;
  700.  
  701.   end Dispatch;
  702.  
  703. end Command_Dispatcher;
  704. --::::::::::
  705. --display.adb
  706. --::::::::::
  707. -- ***********************************************************************
  708. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  709. with Primitive_Citation_Handler;
  710. with Unchecked_Conversion; -- standard Ada environment
  711. package body Screen_Display_Controller is
  712.  
  713.   use DAF_Handler; -- for equality tests
  714.  
  715.   Error_Message_Display_Counter : NATURAL := 0;
  716.  
  717.   Search_String_Limit           : constant := 12;
  718.     -- max number of chars displayed
  719.  
  720.   subtype MSTRING is STRING (1..52);
  721.     -- based on length of longest message below
  722.  
  723.   Messages : constant array (ERROR_MESSAGE_ID) of MSTRING := (
  724.     INVALID_COMMAND  =>
  725.       "Invalid Command -- Reenter or type HELP for Help    ",
  726.     CANNOT_ADVANCE   =>
  727.       "Cannot advance beyond the end of this citation      ",
  728.     CANNOT_BACK      =>
  729.       "Cannot back up before the beginning of this citation",
  730.     STACK_EMPTY      =>
  731.       "Location stack is empty                             ",
  732.     STACK_FULL       =>
  733.       "Location stack is full                              ",
  734.     PRINT_LOG        =>
  735.       "Print log file error                                ",
  736.     TOO_MANY_SCREENS =>
  737.       "Too many screens for internal buffers               ",
  738.     SEARCH_STRING    =>
  739.       "Search string not found                             ",
  740.     DAF_NOT_FOUND    =>
  741.       "DAF Not Found - Aborting                            ",
  742.     INTERNAL_DAF_NDFO_ERROR =>
  743.       "Internal DAF Error - No DAF Open                    ",
  744.     INTERNAL_DAF_RE_ERROR =>
  745.       "Internal DAF Error - Read Error                     ",
  746.     INTERNAL_DAF_SO_ERROR =>
  747.       "Internal DAF Error - Stack Overflow                 ",
  748.     INTERNAL_DAF_UE_ERROR =>
  749.       "Internal DAF Error - Unexpected Error               ",
  750.     UNEXPECTED_ERROR =>
  751.       "Unexpected Error -- Continuing                      "
  752.   );
  753.  
  754.   ---------------------------------------------------------------
  755.   -- Support routine
  756.   procedure Display_Prompt (ID             : in STRING;
  757.                             Stack_Size     : in NATURAL;
  758.                             Screen_Number  : in NATURAL;
  759.                             Number_Screens : in NATURAL;
  760.                             Search_String  : in STRING) is
  761.   -- Display prompt on command line; if Search_String is null, do not
  762.   -- display it; clear error message if one is present after one call
  763.   -- to Display_Prompt
  764.  
  765.   begin -- Display_Prompt
  766.  
  767.     -- Check for clear of error message line
  768.     if Error_Message_Display_Counter > 0 then
  769.       Error_Message_Display_Counter := Error_Message_Display_Counter - 1;
  770.       if Error_Message_Display_Counter = 0 then
  771.         Console.Position_Cursor (SYSDEP.Error_Message_Line_Number, 1);
  772.         Console.Erase_Line;
  773.       end if;
  774.     end if;
  775.  
  776.     -- Display prompt line
  777.     Console.Position_Cursor (SYSDEP.Command_Line_Number, 1);
  778.     if (ID'LENGTH = 2) and then
  779.        ((ID(ID'FIRST) = 'C') and (ID(ID'FIRST+1) in 'A' .. 'F')) then
  780.       Console.Put ("App " & ID(ID'FIRST+1));
  781.     else
  782.       Console.Put (ID);
  783.     end if;
  784.     Console.Put (": ");
  785.     Console.Put (Stack_Size, 2);
  786.     Console.Put ("/");
  787.     Console.Put (Screen_Number, 3);
  788.     Console.Put (" of ");
  789.     Console.Put (Number_Screens, 3);
  790.     if Search_String'LENGTH > 0 then
  791.       Console.Put (" (" & '"');
  792.       if Search_String'LENGTH > Search_String_Limit then
  793.         Console.Put (Search_String(Search_String'FIRST ..
  794.                        Search_String'FIRST - 1 +Search_String_Limit) &
  795.                        "..." & '"');
  796.       else
  797.         Console.Put (Search_String & '"');
  798.       end if;
  799.       Console.Put (")");
  800.     end if;
  801.     Console.Put (" -- " & SYSDEP.Program_Name & " Command: ");
  802.     Console.Erase_Line;
  803.  
  804.   end Display_Prompt;
  805.  
  806.   ---------------------------------------------------------------
  807.   procedure Show_Text is
  808.   -- Clear screen and display the text area
  809.     Screen : SCREEN_BUFFER_POINTER;
  810.  
  811.   begin -- Show_Text
  812.  
  813.     -- Clear the screen and home the cursor
  814.     Console.Erase_Display;
  815.     Console.Position_Cursor(1,1);
  816.  
  817.     -- Get the pointer to the screen
  818.     Screen := Primitive_Citation_Handler.Access_Screen;
  819.  
  820.     -- Display lines in the SBuffer
  821.     for I in 1 .. Screen.all'LAST loop
  822.       exit when Screen.all(I).Kind = DAF_Handler.UNUSED;
  823.       Console.Put_Line (Screen.all(I).Str(1..Screen.all(I).Str_Last));
  824.     end loop;
  825.  
  826.   end Show_Text;
  827.  
  828.   ---------------------------------------------------------------
  829.   procedure Mark_Line (Number : in LINE_NUMBER) is
  830.   -- Place the item as a highlighted line on the indicated line number
  831.   begin -- Mark_Line
  832.     Console.Position_Cursor (Console.ROW_NUMBER(Number),
  833.         Console.COLUMN_NUMBER(SYSDEP.Search_Pointer_Column));
  834.     Console.Put ("<");
  835.   end Mark_Line;
  836.  
  837.   ---------------------------------------------------------------
  838.   procedure Show_Prompt is
  839.   -- Display prompt on command line; if Search_String is null, do not
  840.   -- display it; clear error message if one is present after one call
  841.   -- to Show_Prompt
  842.  
  843.     Status : Primitive_Citation_Handler.CITATION_STATISTICS;
  844.  
  845.   begin -- Show_Prompt
  846.     -- Get status information
  847.     Status := Primitive_Citation_Handler.Current_Citation;
  848.  
  849.     -- Display the information
  850.     Display_Prompt
  851.       (Citation_to_Display(Status.ID),
  852.        Status.Stack_Level,
  853.        Status.Current_Screen_Number,
  854.        Status.Total_Number_of_Screens,
  855.        Status.Search_Str(1..Status.Search_Last));
  856.  
  857.   end Show_Prompt;
  858.  
  859.   ---------------------------------------------------------------
  860.   procedure Show_Error (Item : in ERROR_MESSAGE_ID) is
  861.   -- Display error message
  862.   begin -- Show_Error
  863.     Console.Position_Cursor (SYSDEP.Error_Message_Line_Number, 1);
  864.     Console.Put (Messages(Item));
  865.     Error_Message_Display_Counter := 2;
  866.   end Show_Error;
  867.  
  868.   ---------------------------------------------------------------
  869.   procedure Print_Log_File_Closed_Message is
  870.   -- Print the message that the indicated print log file is closed
  871.   begin -- Print_Log_File_Closed_Message
  872.     Console.Position_Cursor (SYSDEP.Error_Message_Line_Number, 1);
  873.     Console.Put_Line("Print Log File " & SYSDEP.Print_File_Name &
  874.                      " is Closed");
  875.   end Print_Log_File_Closed_Message;
  876.  
  877.   ---------------------------------------------------------------
  878.   function Convert_Ptr is new Unchecked_Conversion
  879.     (System.ADDRESS,
  880.      SCREEN_BUFFER_POINTER);
  881.   function Convert (SB_Address : in System.ADDRESS)
  882.     return SCREEN_BUFFER_POINTER is
  883.   -- Given the address of a screen buffer object, return a pointer to it
  884.   begin -- Convert
  885.     return Convert_Ptr (SB_Address);
  886.   end Convert;
  887.  
  888.   ---------------------------------------------------------------
  889.   function Citation_to_Display (CitX : in Citation_Definition.CITATION_ID)
  890.       return STRING is
  891.     function Convert (Item : in STRING) return STRING is
  892.       Result : STRING (1..SYSDEP.Max_String_Length);
  893.     begin -- Convert
  894.       if Item'LENGTH >= 2 and then
  895.          (Item(Item'FIRST) = 'C' and Item(Item'FIRST+1) in '0' .. '9') then
  896.         for I in Item'FIRST+1 .. Item'LAST loop -- skip first char
  897.           if Item(I) = 'P' then
  898.             Result(I-Item'FIRST) := '.';
  899.           else
  900.             Result(I-Item'FIRST) := Item(I);
  901.           end if;
  902.         end loop;
  903.         return Result(1..Item'LENGTH-1);
  904.       else
  905.         return Item;
  906.       end if;
  907.     end Convert;
  908.   begin -- Citation_to_Display
  909.     return Convert (Citation_Definition.CITATION_ID'IMAGE (CitX));
  910.   end Citation_to_Display;
  911.  
  912.   ---------------------------------------------------------------
  913. begin -- initialization section of Screen_Display_Controller
  914.   Console.Set_Terminal (Console.VT100);
  915. end Screen_Display_Controller;
  916.  
  917. --::::::::::
  918. --pcit.adb
  919. --::::::::::
  920. -- ***********************************************************************
  921. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  922. with DAF_Handler;
  923. package body Primitive_Citation_Handler is
  924.  
  925.   use Citation_Definition;  -- for equality and inequality tests infix
  926.  
  927.   -- Used to track the first and last line of each screen displayed
  928.   type SCREEN_BOUNDARIES is record
  929.     First_Line : NATURAL := 0;
  930.     Last_Line  : NATURAL := 0;
  931.   end record;
  932.  
  933.   -- First and last lines for a maximum number of screens
  934.   type CITATION_SCREEN_LIST is array (1..SYSDEP.Max_Number_of_Screens) of
  935.     SCREEN_BOUNDARIES;
  936.  
  937.   -- Information pertaining to each citation
  938.   type CITATION_STATE_INFORMATION is record
  939.     ID                    : Citation_Definition.CITATION_ID;
  940.     Current_Screen        : NATURAL := 0;
  941.     Number_Screens        : NATURAL := 0;
  942.     Screen_List           : CITATION_SCREEN_LIST;
  943.     Search_May_Be_Resumed : BOOLEAN := FALSE;
  944.     Resume_on_Line        : NATURAL;
  945.     File_ID               : DAF_Handler.DAF_ID := 0;
  946.   end record;
  947.  
  948.   -- Stack of information on all citations selected
  949.   type CITATION_VECTOR is array (1..SYSDEP.Citation_Stack_Depth) of
  950.     CITATION_STATE_INFORMATION;
  951.  
  952.   -- The actual stack of citations
  953.   Citation_Stack : CITATION_VECTOR;
  954.   Citation_Index : NATURAL := 1;
  955.  
  956.   -- The current citation we are working on
  957.   Cur_Cit        : CITATION_STATE_INFORMATION;
  958.  
  959.   -- The actual lines on the current screen
  960.   -- This is made global to avoid adding routines with excessive
  961.   --   parameter-passing overhead
  962.   SBuffer      : Screen_Display_Controller.SCREEN_BUFFER;
  963.   SBuffer_Last : NATURAL;
  964.  
  965.   -- Flag used by suspend/resume routines
  966.   Suspend_Flag : BOOLEAN := FALSE;
  967.  
  968.   -- Variables used by search routines
  969.   Search_Str   : SEARCH_STRING;
  970.   Search_Last  : NATURAL := 0;
  971.  
  972.   -- Last citation in sequence from CITATION_ID'FIRST up to CONTENTS
  973.   -- (but not including CONTENTS)
  974.   Last_Citation_in_Sequence : constant Citation_Definition.CITATION_ID :=
  975.     Citation_Definition.CITATION_ID'PRED(Citation_Definition.CONTENTS);
  976.  
  977.   ---------------------------------------------------------------
  978.   -- Support Subprograms
  979.   ---------------------------------------------------------------
  980.   function Is_Blank_Line (Item : in DAF_Handler.LINE) return BOOLEAN is
  981.   -- Determine if the indicated line is blank
  982.     Result : BOOLEAN := TRUE;
  983.   begin -- Is_Blank_Line
  984.  
  985.     -- Proceed if line is not empty
  986.     if Item.Str_Last > 0 then
  987.       for I in 1 .. Item.Str_Last loop
  988.         if Item.Str(I) > ' ' then
  989.           Result := FALSE;
  990.           exit;
  991.         end if;
  992.       end loop;
  993.     end if;
  994.  
  995.     return Result;
  996.  
  997.   end Is_Blank_Line;
  998.  
  999.   ---------------------------------------------------------------
  1000.   procedure Build_Screen_List is
  1001.   -- pass through the citation, noting line ranges for each screen
  1002.  
  1003.     First_Line     : NATURAL  := Citation_Definition.CLV(Cur_Cit.ID).Start;
  1004.     Last_Line      : NATURAL  := Citation_Definition.CLV(Cur_Cit.ID).Stop;
  1005.     Current_Screen : NATURAL  := 0;
  1006.     Line_Count     : NATURAL  := 0;
  1007.  
  1008.   begin -- Build_Screen_List
  1009.  
  1010.     -- Loop through lines of citation, dividing them into screens
  1011.     for I in First_Line .. Last_Line loop
  1012.       Line_Count := Line_Count + 1;
  1013.       if Line_Count = 1 then
  1014.         Current_Screen := Current_Screen + 1;
  1015.         if Current_Screen > SYSDEP.Max_Number_of_Screens then
  1016.           raise SCREEN_COUNT_OVERFLOW;
  1017.         end if;
  1018.         Cur_Cit.Screen_List(Current_Screen).First_Line := I;
  1019.       end if;
  1020.       if Line_Count = SYSDEP.Text_Line_Count then
  1021.         Cur_Cit.Screen_List(Current_Screen).Last_Line := I;
  1022.         Line_Count := 0;
  1023.       end if;
  1024.     end loop;
  1025.  
  1026.     -- If last screen is a partial screen, mark its end
  1027.     if Line_Count > 0 then
  1028.       Cur_Cit.Screen_List(Current_Screen).Last_Line := Last_Line;
  1029.     end if;
  1030.  
  1031.     -- Determine if last screen is blank and remove it from group if so
  1032.     if Current_Screen > 1 then
  1033.  
  1034.       -- Load last screen in citation
  1035.       Cur_Cit.Current_Screen := Current_Screen;
  1036.       Load_Screen_Buffer;
  1037.  
  1038.       -- Check to see if last screen is blank
  1039.       Current_Screen := Current_Screen - 1;  -- assume blank
  1040.       for I in 1 .. SBuffer_Last loop
  1041.         if not Is_Blank_Line (SBuffer(I)) then
  1042.           Current_Screen := Current_Screen + 1;
  1043.           exit;
  1044.         end if;
  1045.       end loop;
  1046.  
  1047.     end if;
  1048.  
  1049.     -- Set current screen to 1st screen and set total number of screens
  1050.     Cur_Cit.Current_Screen := 1;
  1051.     Cur_Cit.Number_Screens := Current_Screen;
  1052.  
  1053.   end Build_Screen_List;
  1054.  
  1055.   ---------------------------------------------------------------
  1056.   function OK_to_Advance_to_Next_Citation return BOOLEAN is
  1057.   begin -- OK_to_Advance_to_Next_Citation
  1058.     return (Cur_Cit.ID >= Citation_Definition.CITATION_ID'FIRST) and
  1059.            (Cur_Cit.ID < Last_Citation_in_Sequence);
  1060.   end OK_to_Advance_to_Next_Citation;
  1061.  
  1062.   ---------------------------------------------------------------
  1063.   function OK_to_Back_to_Previous_Citation return BOOLEAN is
  1064.   begin -- OK_to_Back_to_Previous_Citation
  1065.     return (Cur_Cit.ID > Citation_Definition.CITATION_ID'FIRST) and
  1066.            (Cur_Cit.ID <= Last_Citation_in_Sequence);
  1067.   end OK_to_Back_to_Previous_Citation;
  1068.  
  1069.   ---------------------------------------------------------------
  1070.   function Scan_for_String (SB_Index : in NATURAL) return BOOLEAN is
  1071.   -- scan SBuffer line for string in Search_Str, return TRUE if found
  1072.  
  1073.     Result : BOOLEAN := FALSE;
  1074.  
  1075.     function Is_Equal (Item1, Item2 : in STRING) return BOOLEAN is
  1076.     -- Determine if two strings are equal (case insensitive)
  1077.       Result : BOOLEAN := TRUE;
  1078.  
  1079.       function To_Lower (Item : in CHARACTER) return CHARACTER is
  1080.       begin -- To_Lower
  1081.         if Item in 'A' .. 'Z' then
  1082.           return CHARACTER'VAL(CHARACTER'POS(Item) - CHARACTER'POS('A') +
  1083.                                CHARACTER'POS('a'));
  1084.         else
  1085.           return Item;
  1086.         end if;
  1087.       end To_Lower;
  1088.  
  1089.     begin -- Is_Equal
  1090.       for I in Item1'RANGE loop
  1091.         if To_Lower(Item1(I)) /=
  1092.            To_Lower(Item2(Item2'FIRST + I - Item1'FIRST)) then
  1093.           Result := FALSE;
  1094.           exit;
  1095.         end if;
  1096.       end loop;
  1097.       return Result;
  1098.     end Is_Equal;
  1099.  
  1100.   begin -- Scan_for_String
  1101.  
  1102.     -- If the line in the SBuffer is as large as the target string,
  1103.     -- then proceed, else fail search immediately
  1104.     if Search_Last <= SBuffer(SB_Index).Str_Last then
  1105.  
  1106.       -- Check substrings starting at first character in SBuffer
  1107.       for I in 1 .. SBuffer(SB_Index).Str_Last-Search_Last + 1 loop
  1108.         if Is_Equal (SBuffer(SB_Index).Str(I .. I + Search_Last - 1),
  1109.                      Search_Str(1..Search_Last)) then
  1110.           Result := TRUE;
  1111.           exit;
  1112.         end if;
  1113.       end loop;
  1114.  
  1115.     end if;
  1116.  
  1117.     return Result;
  1118.  
  1119.   end Scan_for_String;
  1120.  
  1121.   ---------------------------------------------------------------
  1122.   function Linear_Search (Start_Screen : in NATURAL;
  1123.                           Start_Line   : in NATURAL) return SEARCH_STATUS is
  1124.   -- Search forward from Search_Line to the end of the citation
  1125.     Start         : NATURAL := Start_Line;
  1126.     Dummy         : BOOLEAN := TRUE;
  1127.     Result        : SEARCH_STATUS := (FALSE, 0, 0);
  1128.     Saved_Status  : SEARCH_STATUS := (Cur_Cit.Search_May_Be_Resumed,
  1129.                                       Cur_Cit.Current_Screen,
  1130.                                       Cur_Cit.Resume_on_Line);
  1131.   begin -- Linear_Search
  1132.     search_loop:
  1133.     for S in Start_Screen..Cur_Cit.Number_Screens loop
  1134.       Cur_Cit.Current_Screen := S;
  1135.       Load_Screen_Buffer;
  1136.       for L in Start .. SBuffer'Last loop
  1137.         if Scan_For_String(L) then
  1138.           Result.Is_Found         := TRUE;
  1139.           Result.Found_on_Screen  := S;
  1140.           Result.Found_on_Line    := L;
  1141.           exit search_loop;
  1142.         end if;
  1143.       end loop;
  1144.       Start := 1;
  1145.       if S < Cur_Cit.Number_Screens then
  1146.         Dummy := Next_Screen;
  1147.       end if;
  1148.     end loop search_loop;
  1149.     if Result.Is_Found then
  1150.       Cur_Cit.Resume_on_Line := Result.Found_on_Line;
  1151.       Cur_Cit.Search_May_Be_Resumed := TRUE;
  1152.     else
  1153.       Cur_Cit.Current_Screen := Saved_Status.Found_on_Screen;
  1154.       Load_Screen_Buffer;
  1155.       Cur_Cit.Resume_on_Line := Saved_Status.Found_on_Line;
  1156.       Cur_Cit.Search_May_Be_Resumed := Saved_Status.Is_Found;
  1157.     end if;
  1158.     return Result;
  1159.   end Linear_Search;
  1160.  
  1161.   ---------------------------------------------------------------
  1162.   -- Exported Subprograms
  1163.   ---------------------------------------------------------------
  1164.   function DAF_File_Name (ITEM : in Citation_Definition.CITATION_ID)
  1165.       return STRING is
  1166.   begin -- DAF_File_Name
  1167.     if Citation_Definition.CLV(Item).Chapter(1) = ' ' then
  1168.       return "";
  1169.     else
  1170.       return SYSDEP.LRM_Files_Directory &
  1171.              "chap" & Citation_Definition.CLV(Item).Chapter & ".daf";
  1172.     end if;
  1173.   end DAF_File_Name;
  1174.  
  1175.   -----------------------------------------------------------------------
  1176.   procedure Open_New_Citation (ID : in Citation_Definition.CITATION_ID) is
  1177.   -- Open a new citation for processing, closing the old one if
  1178.   -- necessary; set the current screen to the first screen;
  1179.   -- build an array of information on the screens
  1180.   begin -- Open_New_Citation
  1181.  
  1182.     -- Check to see if a DAF file is open and close it if so
  1183.     if Cur_Cit.File_ID > 0 and then
  1184.        DAF_Handler.Is_Open (Cur_Cit.File_ID) then
  1185.       DAF_Handler.Close (Cur_Cit.File_ID);
  1186.     end if;
  1187.  
  1188.     -- Set the ID of the current citation to the new citation
  1189.     Cur_Cit.ID := ID;
  1190.  
  1191.     -- Open the new DAF file
  1192.     Cur_Cit.File_ID := DAF_Handler.Open (DAF_File_Name (ID));
  1193.  
  1194.     -- Build the screen list since we have entered a new citation
  1195.     Build_Screen_List;
  1196.  
  1197.     -- Reset search variable since we have moved screens
  1198.     Cur_Cit.Search_May_Be_Resumed := FALSE;
  1199.  
  1200.     -- Update the current citation stack entry
  1201.     Citation_Stack(Citation_Index) := Cur_Cit;
  1202.  
  1203.   end Open_New_Citation;
  1204.  
  1205.   ---------------------------------------------------------------
  1206.   function Push return BOOLEAN is
  1207.   -- Push the stack, returning TRUE if OK
  1208.   begin -- Push
  1209.     if Citation_Index < SYSDEP.Citation_Stack_Depth then
  1210.       Citation_Stack(Citation_Index) := Cur_Cit;
  1211.       Cur_Cit.File_ID                := 0;
  1212.       Citation_Index                 := Citation_Index + 1;
  1213.       return TRUE;
  1214.     else
  1215.       return FALSE;
  1216.     end if;
  1217.   end Push;
  1218.  
  1219.   ---------------------------------------------------------------
  1220.   function Pop return BOOLEAN is
  1221.   -- Pop the stack, returning TRUE if OK
  1222.   -- Cur_Cit is loaded appropriately
  1223.   begin -- Pop
  1224.     if Citation_Index > 1 then
  1225.       -- Check to see if a DAF file is open and close it if so
  1226.       if DAF_Handler.Is_Open (Cur_Cit.File_ID) then
  1227.         DAF_Handler.Close (Cur_Cit.File_ID);
  1228.       end if;
  1229.       -- Back up on stack
  1230.       Citation_Index := Citation_Index - 1;
  1231.       Cur_Cit := Citation_Stack(Citation_Index);
  1232.       return TRUE;
  1233.     else
  1234.       return FALSE;
  1235.     end if;
  1236.   end Pop;
  1237.  
  1238.   ---------------------------------------------------------------
  1239.   procedure Load_Screen_Buffer is
  1240.   -- Load the screen buffer with the current screen
  1241.     Start_Line : NATURAL;
  1242.     Stop_Line  : NATURAL;
  1243.   begin -- Load_Screen_Buffer
  1244.  
  1245.     -- Set line numbers of first and last lines to load
  1246.     Start_Line := Cur_Cit.Screen_List(Cur_Cit.Current_Screen).First_Line;
  1247.     Stop_Line  := Cur_Cit.Screen_List(Cur_Cit.Current_Screen).Last_Line;
  1248.  
  1249.     -- Read first line via direct access
  1250.     SBuffer(1) := DAF_Handler.Read (Cur_Cit.File_ID, Start_Line);
  1251.     SBuffer_Last := 1;
  1252.  
  1253.     -- Read in rest of lines sequentially
  1254.     for I in Start_Line+1 .. Stop_Line loop
  1255.       SBuffer_Last := SBuffer_Last + 1;
  1256.       SBuffer(SBuffer_Last) := DAF_Handler.Read_Next (Cur_Cit.File_ID);
  1257.     end loop;
  1258.  
  1259.     -- If any lines left, mark them unused
  1260.     if SBuffer_Last < SBuffer'LAST then
  1261.       for I in SBuffer_Last+1 .. SBuffer'LAST loop
  1262.         SBuffer(I).Kind := DAF_Handler.UNUSED;
  1263.       end loop;
  1264.     end if;
  1265.  
  1266.     -- Set search flag to indicate that continuation of search
  1267.     -- from the Resume_on_Line is not possible since the SBuffer
  1268.     -- has been reloaded
  1269.     Cur_Cit.Search_May_Be_Resumed := FALSE;
  1270.  
  1271.   end Load_Screen_Buffer;
  1272.  
  1273.   ---------------------------------------------------------------
  1274.   function Next_Screen return BOOLEAN is
  1275.   -- Advance to the next screen, returning TRUE if done;
  1276.   -- if at last screen of current citation, advance to the first screen
  1277.   -- of the next citation
  1278.   -- Screen Buffer is loaded appropriately
  1279.     Result : BOOLEAN := FALSE;
  1280.  
  1281.   begin -- Next_Screen
  1282.  
  1283.     -- Advance to next screen if we have not reached the
  1284.     -- total number of screens; if we advanced, reload the
  1285.     -- SBuffer
  1286.     if Cur_Cit.Current_Screen < Cur_Cit.Number_Screens then
  1287.       Cur_Cit.Current_Screen := Cur_Cit.Current_Screen + 1;
  1288.       Load_Screen_Buffer;
  1289.       return TRUE;
  1290.     else
  1291.       return Next_Citation;
  1292.     end if;
  1293.  
  1294.   end Next_Screen;
  1295.  
  1296.   ---------------------------------------------------------------
  1297.   function Previous_Screen return BOOLEAN is
  1298.   -- Back up to the previous screen, returning TRUE if done;
  1299.   -- if at first screen of current citation, back up to last screen
  1300.   -- of previous citation
  1301.   -- Screen Buffer is loaded appropriately
  1302.   begin -- Previous_Screen
  1303.  
  1304.     if Cur_Cit.Current_Screen > 1 then
  1305.       Cur_Cit.Current_Screen := Cur_Cit.Current_Screen - 1;
  1306.       Load_Screen_Buffer;
  1307.       return TRUE;
  1308.     elsif OK_To_Back_To_Previous_Citation then
  1309.       Open_New_Citation (Citation_Definition.CITATION_ID'PRED(Cur_Cit.ID));
  1310.       Cur_Cit.Current_Screen := Cur_Cit.Number_Screens;
  1311.       Load_Screen_Buffer;
  1312.       return TRUE;
  1313.     else
  1314.       return FALSE;
  1315.     end if;
  1316.  
  1317.   end Previous_Screen;
  1318.  
  1319.   ---------------------------------------------------------------
  1320.   function Next_Citation return BOOLEAN is
  1321.   -- Advance to the first screen of the next citation, return TRUE if done
  1322.   -- Screen Buffer is loaded appropriately
  1323.   begin -- Next_Citation
  1324.  
  1325.     if OK_to_Advance_to_Next_Citation then
  1326.       Open_New_Citation(Citation_Definition.CITATION_ID'SUCC(Cur_Cit.ID));
  1327.       Load_Screen_Buffer;
  1328.       return TRUE;
  1329.     else
  1330.       return FALSE;
  1331.     end if;
  1332.  
  1333.   end Next_Citation;
  1334.  
  1335.   ---------------------------------------------------------------
  1336.   function Previous_Citation return BOOLEAN is
  1337.   -- Back up to the first screen of the previous citation, return TRUE
  1338.   -- if done
  1339.   -- Screen Buffer is loaded appropriately
  1340.   begin -- Previous_Citation
  1341.  
  1342.     if OK_to_Back_to_Previous_Citation then
  1343.       Open_New_Citation(Citation_Definition.CITATION_ID'PRED(Cur_Cit.ID));
  1344.       Load_Screen_Buffer;
  1345.       return TRUE;
  1346.     else
  1347.       return FALSE;
  1348.     end if;
  1349.  
  1350.   end Previous_Citation;
  1351.  
  1352.   ---------------------------------------------------------------
  1353.   function Search_First (Item : in STRING) return SEARCH_STATUS is
  1354.   -- Search for the Item from the beginning of the citation;
  1355.   -- if Item is an empty string, resume search for last item requested
  1356.     Result : SEARCH_STATUS;
  1357.   begin -- Search_First
  1358.     if Item'LENGTH > 0 then
  1359.       Search_Str(1..Item'LENGTH) := Item;
  1360.       Search_Last                := Item'LENGTH;
  1361.     end if;
  1362.     Result := Linear_Search (Cur_Cit.Current_Screen, 1);
  1363.     if Result.Is_Found then
  1364.       Cur_Cit.Search_May_Be_Resumed := TRUE;
  1365.       Cur_Cit.Resume_on_Line        := Result.Found_on_Line;
  1366.     end if;
  1367.     return Result;
  1368.   end Search_First;
  1369.  
  1370.   ---------------------------------------------------------------
  1371.   function Search_Next (Item : in STRING) return SEARCH_STATUS is
  1372.   -- Resume search for Item from the next line in the citation;
  1373.   -- if Item is an empty string, resume search for last item requested
  1374.     Result : SEARCH_STATUS;
  1375.     Start  : NATURAL;
  1376.   begin -- Search_Next
  1377.     if Item'LENGTH > 0 then
  1378.       Search_Str(1..Item'LENGTH) := Item;
  1379.       Search_Last                := Item'LENGTH;
  1380.     end if;
  1381.     if Cur_Cit.Search_May_Be_Resumed then
  1382.       Start := Cur_Cit.Resume_on_Line+1;
  1383.     else
  1384.       Start := 1;
  1385.     end if;
  1386.     Result := Linear_Search (Cur_Cit.Current_Screen, Start);
  1387.     if Result.Is_Found then
  1388.       Cur_Cit.Search_May_Be_Resumed := TRUE;
  1389.       Cur_Cit.Resume_on_Line        := Result.Found_on_Line;
  1390.     end if;
  1391.     return Result;
  1392.   end Search_Next;
  1393.  
  1394.   ---------------------------------------------------------------
  1395.   function Current_Citation return CITATION_STATISTICS is
  1396.   -- Return the statistics on the current citation
  1397.   begin -- Current_Citation
  1398.     return CITATION_STATISTICS'
  1399.       (ID                      => Cur_Cit.ID,
  1400.        Current_Screen_Number   => Cur_Cit.Current_Screen,
  1401.        Total_Number_of_Screens => Cur_Cit.Number_Screens,
  1402.        Stack_Level             => Citation_Index,
  1403.        Search_Str              => Search_Str,
  1404.        Search_Last             => Search_Last,
  1405.        Search_May_Be_Continued => Cur_Cit.Search_May_Be_Resumed);
  1406.   end Current_Citation;
  1407.  
  1408.   ---------------------------------------------------------------
  1409.   procedure Close_All_Open_Citations is
  1410.   -- Close all open citation files
  1411.   begin -- Close_All_Open_Citations
  1412.     for I in 1..Citation_Index loop
  1413.       DAF_Handler.Close (Citation_Stack(I).File_ID);
  1414.     end loop;
  1415.   end Close_All_Open_Citations;
  1416.  
  1417.   ---------------------------------------------------------------
  1418.   procedure Suspend is
  1419.   -- Suspend operation for Print_Log_Handler
  1420.   begin -- Suspend
  1421.     if not Suspend_Flag then
  1422.       if Cur_Cit.File_ID > 0 and then
  1423.          DAF_Handler.Is_Open (Cur_Cit.File_ID) then
  1424.         DAF_Handler.Close (Cur_Cit.File_ID);
  1425.       end if;
  1426.       Suspend_Flag := TRUE;
  1427.     end if;
  1428.   end Suspend;
  1429.  
  1430.   ---------------------------------------------------------------
  1431.   procedure Resume is
  1432.   -- Resume operation for Print_Log_Handler
  1433.   begin -- Resume
  1434.     if Suspend_Flag then
  1435.       Cur_Cit.File_ID :=
  1436.         DAF_Handler.Open (DAF_File_Name (Cur_Cit.ID));
  1437.       Load_Screen_Buffer;
  1438.       Suspend_Flag := FALSE;
  1439.     end if;
  1440.   end Resume;
  1441.  
  1442.   ---------------------------------------------------------------
  1443.   function Access_Screen
  1444.     return Screen_Display_Controller.SCREEN_BUFFER_POINTER is
  1445.   -- Return the address of the screen for printing or displaying
  1446.   begin -- Access_Screen
  1447.     return Screen_Display_Controller.Convert (SBuffer'ADDRESS);
  1448.   end Access_Screen;
  1449.  
  1450. end Primitive_Citation_Handler;
  1451. --::::::::::
  1452. --cith2.adb
  1453. --::::::::::
  1454. -- ***********************************************************************
  1455. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  1456. with Primitive_Citation_Handler;
  1457. with Screen_Display_Controller;
  1458. package body Citation_Handler is
  1459.  
  1460.   ---------------------------------------------------------------
  1461.   -- Exported Subprograms
  1462.   ---------------------------------------------------------------
  1463.   procedure View_Citation (New_Citation : in Citation_Definition.CITATION_ID)
  1464.       is
  1465.   -- Start viewing a new citation, displaying the first screen
  1466.   begin -- View_Citation
  1467.     Primitive_Citation_Handler.Open_New_Citation (New_Citation);
  1468.     Primitive_Citation_Handler.Load_Screen_Buffer;
  1469.     Redisplay_Current_Screen;
  1470.   end View_Citation;
  1471.  
  1472.   ---------------------------------------------------------------
  1473.   procedure Redisplay_Current_Screen is
  1474.   -- Refresh current screen in current citation
  1475.   begin -- Redisplay_Current_Screen
  1476.     Screen_Display_Controller.Show_Text;
  1477.   end Redisplay_Current_Screen;
  1478.  
  1479.   ---------------------------------------------------------------
  1480.   procedure Next_Screen is
  1481.   -- Advance to next screen in current citation and display
  1482.     dummy : BOOLEAN;
  1483.   begin -- Next_Screen
  1484.     if Primitive_Citation_Handler.Next_Screen then
  1485.       Redisplay_Current_Screen;
  1486.     else
  1487.       Screen_Display_Controller.Show_Error
  1488.         (Screen_Display_Controller.CANNOT_ADVANCE);
  1489.     end if;
  1490.   end Next_Screen;
  1491.  
  1492.   ---------------------------------------------------------------
  1493.   procedure Previous_Screen is
  1494.   -- Back up to previous screen in current citation and display
  1495.   begin -- Previous_Screen
  1496.     if Primitive_Citation_Handler.Previous_Screen then
  1497.       Redisplay_Current_Screen;
  1498.     else
  1499.       Screen_Display_Controller.Show_Error
  1500.         (Screen_Display_Controller.CANNOT_BACK);
  1501.     end if;
  1502.   end Previous_Screen;
  1503.  
  1504.   ---------------------------------------------------------------
  1505.   procedure Next_Citation is
  1506.   -- Close current citation and view first screen of next citation
  1507.   begin -- Next_Citation
  1508.     if Primitive_Citation_Handler.Next_Citation then
  1509.       Redisplay_Current_Screen;
  1510.     else
  1511.       Screen_Display_Controller.Show_Error
  1512.         (Screen_Display_Controller.CANNOT_ADVANCE);
  1513.     end if;
  1514.   end Next_Citation;
  1515.  
  1516.   ---------------------------------------------------------------
  1517.   procedure Previous_Citation is
  1518.   -- Close current citation and view first screen of previous citation
  1519.   begin -- Previous_Citation
  1520.     if Primitive_Citation_Handler.Previous_Citation then
  1521.       Redisplay_Current_Screen;
  1522.     else
  1523.       Screen_Display_Controller.Show_Error
  1524.         (Screen_Display_Controller.CANNOT_BACK);
  1525.     end if;
  1526.   end Previous_Citation;
  1527.  
  1528.   ---------------------------------------------------------------
  1529.   procedure Push (New_Citation : in Citation_Definition.CITATION_ID) is
  1530.   -- Save position in current citation and
  1531.   -- start viewing a new citation, displaying the first screen
  1532.   begin -- Push
  1533.     if Primitive_Citation_Handler.Push then
  1534.       Primitive_Citation_Handler.Open_New_Citation (New_Citation);
  1535.       Primitive_Citation_Handler.Load_Screen_Buffer;
  1536.       Redisplay_Current_Screen;
  1537.     else
  1538.       Screen_Display_Controller.Show_Error
  1539.         (Screen_Display_Controller.STACK_FULL);
  1540.     end if;
  1541.   end Push;
  1542.  
  1543.   ---------------------------------------------------------------
  1544.   procedure Pop is
  1545.   -- Return to current position in last citation before last PUSH
  1546.   begin -- Pop
  1547.     if Primitive_Citation_Handler.Pop then
  1548.       Primitive_Citation_Handler.Load_Screen_Buffer;
  1549.       Redisplay_Current_Screen;
  1550.     else
  1551.       Screen_Display_Controller.Show_Error
  1552.         (Screen_Display_Controller.STACK_EMPTY);
  1553.     end if;
  1554.   end Pop;
  1555.  
  1556.   ---------------------------------------------------------------
  1557.   procedure Search_for_First_Occurrence (Item : in STRING) is
  1558.   -- Search for first occurrence of string in current citation
  1559.     Result : Primitive_Citation_Handler.SEARCH_STATUS;
  1560.   begin -- Search_for_First_Occurrence
  1561.     Result := Primitive_Citation_Handler.Search_First(Item);
  1562.     Redisplay_Current_Screen;
  1563.     if Result.Is_Found then
  1564.       Screen_Display_Controller.Mark_Line (Result.Found_on_Line);
  1565.     else
  1566.       Screen_Display_Controller.Show_Error
  1567.         (Screen_Display_Controller.SEARCH_STRING);
  1568.     end if;
  1569.   end Search_for_First_Occurrence;
  1570.  
  1571.   ---------------------------------------------------------------
  1572.   procedure Search_for_Next_Occurrence (Item : in STRING) is
  1573.   -- Search for next occurrence of string in current citation
  1574.     Result : Primitive_Citation_Handler.SEARCH_STATUS;
  1575.   begin -- Search_for_First_Occurrence
  1576.     Result := Primitive_Citation_Handler.Search_Next(Item);
  1577.     Redisplay_Current_Screen;
  1578.     if Result.Is_Found then
  1579.       Screen_Display_Controller.Mark_Line (Result.Found_on_Line);
  1580.     else
  1581.       Screen_Display_Controller.Show_Error
  1582.         (Screen_Display_Controller.SEARCH_STRING);
  1583.     end if;
  1584.   end Search_for_Next_Occurrence;
  1585.  
  1586.   ---------------------------------------------------------------
  1587.   procedure Close_All_Open_Citations is
  1588.   -- Close all open citations
  1589.   begin -- Close
  1590.     Primitive_Citation_Handler.Close_All_Open_Citations;
  1591.   end Close_All_Open_Citations;
  1592.  
  1593. end Citation_Handler;
  1594. --::::::::::
  1595. --printlog.adb
  1596. --::::::::::
  1597. -- ***********************************************************************
  1598. -- ON-LINE Ada LANGUAGE REFERENCE MANUAL by Richard Conn
  1599. with SYSDEP;
  1600. with Citation_Definition;
  1601. with DAF_Handler;
  1602. with Primitive_Citation_Handler;
  1603. with Screen_Display_Controller;
  1604. with Output_File; -- CS Parts
  1605. package body Print_Log_Handler is
  1606.  
  1607.   use DAF_Handler; -- for equality test
  1608.  
  1609.   Output_File_ID : Output_File.FILE_TYPE;
  1610.   Is_Open        : BOOLEAN := FALSE;
  1611.  
  1612.   ---------------------------------------------------------------
  1613.   procedure Print_Banner is
  1614.  
  1615.     Current_Stats : Primitive_Citation_Handler.CITATION_STATISTICS;
  1616.  
  1617.   begin -- Print_Banner
  1618.  
  1619.     -- Open output file if needed
  1620.     if not Is_Open then
  1621.       Output_File.Create (Output_File_ID, SYSDEP.Print_File_Name);
  1622.       Is_Open := TRUE;
  1623.     end if;
  1624.  
  1625.     Current_Stats := Primitive_Citation_Handler.Current_Citation;
  1626.     Output_File.Put_Line (Output_File_ID,
  1627.                 "----------------------------------------------------");
  1628.     Output_File.Put_Line (Output_File_ID,
  1629.                 "-- Citation: " &
  1630.                 Screen_Display_Controller.Citation_to_Display
  1631.                   (Current_Stats.ID));
  1632.  
  1633.   end Print_Banner;
  1634.  
  1635.   ---------------------------------------------------------------
  1636.   procedure Print_Current_Citation is
  1637.  
  1638.     Current_Stats : Primitive_Citation_Handler.CITATION_STATISTICS;
  1639.     Input_File    : DAF_Handler.DAF_ID;
  1640.     Inline        : DAF_Handler.LINE;
  1641.  
  1642.   begin -- Print_Current_Citation
  1643.  
  1644.     -- Print banner
  1645.     Print_Banner;
  1646.  
  1647.     -- Copy citation section to output file
  1648.     Current_Stats := Primitive_Citation_Handler.Current_Citation;
  1649.     if Primitive_Citation_Handler.DAF_File_Name(Current_Stats.ID)'LENGTH > 0
  1650.         then
  1651.       Primitive_Citation_Handler.Suspend;
  1652.       begin
  1653.         Input_File := DAF_Handler.Open
  1654.           (Primitive_Citation_Handler.DAF_File_Name(Current_Stats.ID));
  1655.         Inline := DAF_Handler.Read
  1656.           (Input_File, Citation_Definition.CLV(Current_Stats.ID).Start);
  1657.         Output_File.Put_Line
  1658.           (Output_File_ID, Inline.Str(1..Inline.Str_Last));
  1659.         for I in Citation_Definition.CLV(Current_Stats.ID).Start+1 ..
  1660.                  Citation_Definition.CLV(Current_Stats.ID).Stop
  1661.             loop
  1662.           Inline := DAF_Handler.Read_Next (Input_File);
  1663.           Output_File.Put_Line
  1664.             (Output_File_ID, Inline.Str(1..Inline.Str_Last));
  1665.         end loop;
  1666.       exception
  1667.         when others => null;  -- assume EOF
  1668.       end;
  1669.       DAF_Handler.Close (Input_File);
  1670.       Primitive_Citation_Handler.Resume;
  1671.     end if;
  1672.  
  1673.   exception -- Print_Current_Citation
  1674.     when others => raise PRINT_LOG_CREATION_ERROR;
  1675.   end Print_Current_Citation;
  1676.  
  1677.   ---------------------------------------------------------------
  1678.   procedure Print_Current_Screen is
  1679.   -- Print indicated screen to log file
  1680.     Screen        : Screen_Display_Controller.SCREEN_BUFFER_POINTER;
  1681.     Current_Stats : Primitive_Citation_Handler.CITATION_STATISTICS;
  1682.  
  1683.   begin -- Print_Current_Screen
  1684.  
  1685.     -- Print banner
  1686.     Current_Stats := Primitive_Citation_Handler.Current_Citation;
  1687.     Print_Banner;
  1688.     Screen := Primitive_Citation_Handler.Access_Screen;
  1689.     Output_File.Put_Line (Output_File_ID,
  1690.                       "-- Screen Number:" &
  1691.                       NATURAL'IMAGE(Current_Stats.Current_Screen_Number));
  1692.  
  1693.     -- Output lines of screen
  1694.     for I in 1 .. Screen.all'LAST loop
  1695.       exit when Screen.all(I).Kind = DAF_Handler.UNUSED;
  1696.       Output_File.Put_Line
  1697.         (Output_File_ID, Screen.all(I).Str(1..Screen.all(I).Str_Last));
  1698.     end loop;
  1699.  
  1700.   exception
  1701.     when others => raise PRINT_LOG_CREATION_ERROR;
  1702.   end Print_Current_Screen;
  1703.  
  1704.   ---------------------------------------------------------------
  1705.   procedure Close_Print_Log is
  1706.   begin -- Close_Print_Log
  1707.     if Is_Open then
  1708.       Output_File.Close (Output_File_ID);
  1709.       Screen_Display_Controller.Print_Log_File_Closed_Message;
  1710.     end if;
  1711.   end Close_Print_Log;
  1712.  
  1713. end Print_Log_Handler;
  1714.